package models

import (
	"goods_srv/basic/config"
	"time"
)

type GoodsOrder struct {
	Id          uint64    `gorm:"column:id;type:bigint UNSIGNED;primaryKey;not null;" json:"id"`
	OrderNo     string    `gorm:"column:order_no;type:varchar(100);comment:订单号;default:NULL;" json:"order_no"`                          // 订单号
	AddressId   int32     `gorm:"column:address_id;type:int;comment:地址id;default:NULL;" json:"address_id"`                              // 地址id
	UserId      int32     `gorm:"column:user_id;type:int;comment:用户id;not null;" json:"user_id"`                                        // 用户id
	GoodId      int32     `gorm:"column:good_id;type:int;comment:商品id;not null;" json:"good_id"`                                        // 商品id
	ShopId      int32     `gorm:"column:shop_id;type:int;comment:商家id;not null;" json:"shop_id"`                                        // 商家id
	GoodsNum    int32     `gorm:"column:goods_num;type:int;comment:购买商品的数量;not null;" json:"goods_num"`                                 // 购买商品的数量
	GoodsName   string    `gorm:"column:goods_name;type:varchar(30);comment:商品名称;default:NULL;" json:"goods_name"`                      // 商品名称
	GoodsPrice  int64     `gorm:"column:goods_price;type:bigint;comment:商品价格;default:NULL;" json:"goods_price"`                         // 商品价格
	OrderPrice  float64   `gorm:"column:order_price;type:decimal(10, 2);comment:订单价格;default:NULL;" json:"order_price"`                 // 订单价格
	PayCType    int32     `gorm:"column:pay_c_type;type:int;comment:支付方式：1：微信2：支付宝;default:NULL;" json:"pay_c_type"`                    // 支付方式：1：微信2：支付宝
	PayStatus   int32     `gorm:"column:pay_status;type:int;comment:支付状态：1：已支付，2：未支付;default:NULL;" json:"pay_status"`                  // 支付状态：1：已支付，2：未支付
	OrderStatus int32     `gorm:"column:order_status;type:int;comment:订单状态 1待支付 2待发货 3已发货 4待接收 5已完成;default:NULL;" json:"order_status"` // 订单状态 1待支付 2待发货 3已发货 4待接收 5已完成
	CreatedAt   time.Time `gorm:"column:created_at;type:datetime(3);not null;default:CURRENT_TIMESTAMP(3);" json:"created_at"`
	UpdatedAt   time.Time `gorm:"column:updated_at;type:datetime(3);not null;default:CURRENT_TIMESTAMP(3);" json:"updated_at"`
	DeletedAt   time.Time `gorm:"column:deleted_at;type:datetime(3);default:NULL;" json:"deleted_at"`
}

func (o *GoodsOrder) TableName() string {
	return "goods_order"
}

// 创建订单
func (o *GoodsOrder) Create() error {
	return config.DB.Create(&o).Error
}

// 详情
func (o *GoodsOrder) Detail() error {
	return config.DB.Where("id = ?", o.Id).Find(&o).Error
}

// 根据id查询订单
func (o *GoodsOrder) GetOrderById() error {
	return config.DB.Where("id = ?", o.Id).Limit(1).Find(&o).Error
}

// 删除订购单
func (o *GoodsOrder) DelOrder() error {
	return config.DB.Delete(&o).Error
}

// 修改订单信息
func (o *GoodsOrder) Update() error {
	return config.DB.Where("id = ?", o.Id).Updates(&o).Error
}

// 获取订单Id
func (o *GoodsOrder) DistributionGetOrderId() error {
	return config.DB.First(&o).Error
}

// 订单详情
func (o *GoodsOrder) GetOrderDetail() (res OrderDetailResp, err error) {
	err = config.DB.Table("goods_order").Select("goods_order.*, address.address as address,shop.shop_name").
		Joins("left join address on goods_order.address_id = address.id").
		Joins("left join shop on goods_order.shop_id = shop.id").
		Where("goods_order.id = ?", o.Id).Limit(1).Find(&res).Error
	return
}

type OrderDetailResp struct {
	Id          uint64    `json:"id,omitempty"`
	OrderNo     string    `json:"orderNo,omitempty"`
	AddressId   int32     `json:"addressId,omitempty"`
	Address     string    `json:"address,omitempty"`
	UserId      int32     `json:"userId,omitempty"`
	GoodId      int32     `json:"goodId,omitempty"`
	ShopId      int32     `json:"shopId,omitempty"`
	ShopName    string    `json:"shopName,omitempty"`
	GoodsNum    int32     `json:"goodsNum,omitempty"`
	GoodsName   string    `json:"goodsName,omitempty"`
	GoodsPrice  int64     `json:"goodsPrice,omitempty"`
	OrderPrice  float64   `json:"orderPrice,omitempty"`
	PayCType    int32     `json:"payCType,omitempty"`
	PayStatus   int32     `json:"payStatus,omitempty"`
	OrderStatus int32     `json:"orderStatus,omitempty"`
	CreatedAt   time.Time `json:"createdAt"`
}
